package com.rhett.autoMyBatis.utils;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author huzhipeng
 * @date 2020/11/10
 */
public class FreemarkerUtils {

    public static void main(String[] args) throws Exception {
        //项目信息
        String tableName = "gaea_address";
        String className = "Address";
        String tableSchema = "tuya_gaea";
        String description = "描述";
        String author = "作者";

        String projectUrl = "/Users/huzhipeng/IdeaProjects/gesla/gesla-core/src/main/java/";
        String moudleName = "address";
        String doPackage = "com.tuya.gelsa.core.domain."+moudleName;
        String queryPackage = "com.tuya.gesla.client.domain.query."+moudleName;
        String voPackage = "com.tuya.gesla.client.domain.vo."+moudleName;
        String daoPackage = "com.tuya.gesla.client.domain.dao."+moudleName;
        String idaoPackage = "com.tuya.gesla.core.dao.dao"+moudleName+".impl";

        DBConnection dbConnection = new DBConnection();
        dbConnection.setDriver("com.mysql.jdbc.Driver");
        dbConnection.setDb("tuya_gaea");
        dbConnection.setUrl("jdbc:mysql://172.16.248.10:3306/");
        dbConnection.setPassword("root");
        dbConnection.setUsername("root");
        List<TableColumn> list = DBUtils.query(dbConnection, "SELECT COLUMN_NAME columnName,COLUMN_COMMENT columnComment,DATA_TYPE dataType FROM information_schema.COLUMNS WHERE table_name = 'gaea_address' AND table_schema = 'tuya_gaea' ORDER BY ordinal_position"
                , TableColumn.class);

        List<TableColumnVO> tableColumnVOS= new ArrayList<>();
        list.forEach(vo->{
            TableColumnVO tableColumnVO = new TableColumnVO();
            tableColumnVO.setFiledName(lineToHump(vo.getColumnName(),false));
            tableColumnVO.setFiledType(coverJavaType(vo.getDataType()));
            tableColumnVO.setColumnComment(vo.getColumnComment());
            tableColumnVO.setColumnName(vo.getColumnName());
            tableColumnVO.setDataType(vo.getDataType());
            tableColumnVOS.add(tableColumnVO);
        });

        Map map = new HashMap();
        map.put("className",className);
        map.put("tableName",tableName);
        map.put("columnList",tableColumnVOS);
        map.put("description",description);
        map.put("author",author);
        map.put("date", LocalDate.now());
        map.put("queryPackage", queryPackage);
        map.put("doPackage", doPackage);
        map.put("voPackage", voPackage);
        map.put("daoPackage", daoPackage);
        map.put("idaoPackage", idaoPackage);

        generate("XML_MAPPER.ftl",map,"/Users/huzhipeng/IdeaProjects/autoMyBatis/codeGen/"+moudleName+"/"+ tableName +".xml");
//        generate("entityDO.ftl",map,"/Users/huzhipeng/rhettProject/codeGen/"+moudleName+"/"+ className +"DO.java");
//        generate("entityVO.ftl",map,"/Users/huzhipeng/rhettProject/codeGen/"+moudleName+"/"+ className +"VO.java");
//        generate("entityQuery.ftl",map,"/Users/huzhipeng/rhettProject/codeGen/"+moudleName+"/"+ className +"Query.java");
//        generate("IDAO.ftl",map,"/Users/huzhipeng/rhettProject/codeGen/"+moudleName+"/I"+ className +"DAO.java");
    }

    /**
     * 生成模版
     * @param templateName 生成的文件名称
     * @param dateModel 模版数据
     * @param createFilePath  文件生成的地址
     * */
    public static void generate(String templateName, Map dateModel, String createFilePath) throws TemplateException, IOException {
        // 第一步：创建一个Configuration对象，直接new一个对象。构造方法的参数就是freemarker对于的版本号。
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 第二步：设置模板文件所在的路径。
        configuration.setDirectoryForTemplateLoading(
                new File(FreemarkerUtils.class.getClassLoader().getResource("templates").getPath()));
        // 第三步：设置模板文件使用的字符集。一般就是utf-8.
        configuration.setDefaultEncoding("utf-8");
        // 第四步：加载一个模板，创建一个模板对象。
        Template template = configuration.getTemplate(templateName);
        // 第六步：创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        File file = new File(createFilePath);
        if(!file.exists()){
            //先得到文件的上级目录，并创建上级目录，在创建文件
            file.getParentFile().mkdirs();
            try {
                //创建文件
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Writer out = new FileWriter(file);
        // 第七步：调用模板对象的process方法输出文件。
        template.process(dateModel, out);
        // 第八步：关闭流。
        out.close();
    }

    /**
     * 数据库字段类型转java类型
     * */
    public static String coverJavaType(String dataType) {
            if ("varchar".equals(dataType) || "char".equals(dataType)){
                return "String";
            }else if ("int".equals(dataType)|| "tinyint".equals(dataType)){
                return  "Integer";
            } else if("bigint".equals(dataType)){
               return "Long";
            }
            return dataType;
    }

    /**
     * 下划线转驼峰
     * */
    private static Pattern linePattern = Pattern.compile("_(\\w)");

    public static String lineToHump(String str,boolean firstUpper) {
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        if (firstUpper){
            return sb.substring(0, 1).toUpperCase() + sb.substring(1);
        }
        return sb.toString();
    }


}
